home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d977.lha / UChess / UChessSrc.lha / init.c < prev    next >
C/C++ Source or Header  |  1994-03-29  |  20KB  |  806 lines

  1. /*
  2.  * init.c - C source for GNU CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include "gnuchess.h"
  24.  
  25. #ifdef CACHE
  26. extern struct etable __far __aligned etab[2][ETABLE];
  27. #endif
  28.  
  29. #ifdef AMIGA
  30. #define __USE_SYSBASE
  31. #define MOVENOWMENUNUM 0x42
  32. #define THINKMENUNUM 0x82
  33. #define SHOWMENUNUM 0xa2
  34. #define BOOKMENUNUM 0xc2
  35. #define SUPERMENUNUM 0xe2
  36. #define ADVANCEDMENUNUM 0x102
  37. #define INTERMEDIATEMENUNUM 0x122
  38. #define EASYMENUNUM 0x142
  39. #include <proto/exec.h>
  40. #include <proto/dos.h>
  41. #include <proto/intuition.h>
  42. extern int procpri;
  43. extern struct Process *myproc;
  44. extern int __far ResignOffered;
  45. #endif
  46.  
  47. extern struct Menu Menu1;
  48. #define MenuList1 Menu1
  49. extern int MenuStripSet;
  50. extern struct MenuItem MenuItem8ab;
  51. extern struct Window __aligned *wG;
  52. unsigned int urand (void);
  53.  
  54.  
  55. /* .... MOVE GENERATION VARIABLES AND INITIALIZATIONS .... */
  56.  
  57.  
  58. short __aligned PCRASH,PCENTER;
  59. extern int PlayMode;
  60. extern unsigned int TTadd;
  61.  
  62. #if defined NULLMOVE || defined DEEPNULL
  63. extern short int __aligned no_null;
  64. extern short int __aligned null;         /* Null-move already made or not */
  65. extern short int __aligned PVari;        /* Is this the PV */
  66. #endif
  67. extern short __aligned Threat[MAXDEPTH];
  68. extern unsigned short int __aligned PrVar[MAXDEPTH];
  69. extern short __aligned PawnStorm;
  70. extern short __aligned start_stage;
  71. extern short __aligned thrashing_tt; /* must we recycle slots at random. TomV */
  72. extern short int ISZERO;
  73. extern int __aligned global_tmp_score;
  74. extern int __aligned previous_score;
  75. int __aligned FirstTime=1;
  76. extern int SupervisorMode;
  77. extern int IllegalMove;
  78. extern int CheckIllegal;
  79. #ifdef LONGINTS2
  80. INTSIZE  __far distdata[64][64];
  81. INTSIZE  __far taxidata[64][64];
  82. #else
  83. INTSIZE  __aligned distdata[64][64];
  84. INTSIZE  __aligned taxidata[64][64];
  85. #endif
  86.  
  87. #ifdef KILLT
  88. /* put moves to the center first */
  89. void
  90. Initialize_killt (void)
  91. {
  92.   REG unsigned INTSIZE f, t, s;
  93.   REG INTSIZE d;
  94.   for (f = 64; f--;)
  95.     for (t = 64; t--;)
  96.       {
  97.     d = taxidata[f][0x1b];
  98.     if (taxidata[f][0x1c] < d)
  99.       d = taxidata[f][0x1c];
  100.     if (taxidata[f][0x23] < d)
  101.       d = taxidata[f][0x23];
  102.     if (taxidata[f][0x24] < d)
  103.       d = taxidata[f][0x24];
  104.     s = d;
  105.     d = taxidata[t][0x1b];
  106.     if (taxidata[t][0x1c] < d)
  107.       d = taxidata[t][0x1c];
  108.     if (taxidata[t][0x23] < d)
  109.       d = taxidata[t][0x23];
  110.     if (taxidata[t][0x24] < d)
  111.       d = taxidata[t][0x24];
  112.     s -= d;
  113.     killt[(f << 8) | t] = s;
  114.     killt[(f << 8) | t | 0x80] = s;
  115.       }
  116. }
  117. #endif
  118. void
  119. Initialize_dist (void)
  120. {
  121.   REG INTSIZE a, b, d, di;
  122.  
  123.   for (a = 0; a < 64; a++)
  124.     for (b = 0; b < 64; b++)
  125.       {
  126.     d = abs (column (a) - column (b));
  127.     di = abs (row (a) - row (b));
  128.     taxidata[a][b] = d + di;
  129.     distdata[a][b] = (d > di ? d : di);
  130.       }
  131. #ifdef KILLT
  132.   Initialize_killt ();
  133. #endif
  134. }
  135.  
  136. const INTSIZE __aligned Stboard[64] =
  137. {rook, knight, bishop, queen, king, bishop, knight, rook,
  138.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  139.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  140.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  141.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  142.  rook, knight, bishop, queen, king, bishop, knight, rook};
  143. const INTSIZE __aligned Stcolor[64] =
  144. {white, white, white, white, white, white, white, white,
  145.  white, white, white, white, white, white, white, white,
  146.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  147.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  148.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  149.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  150.  black, black, black, black, black, black, black, black,
  151.  black, black, black, black, black, black, black, black};
  152. INTSIZE board[64], color[64];
  153.  
  154. /* given epsquare, from where can a pawn be taken? */
  155. const INTSIZE __aligned epmove1[64] =
  156. {0, 1, 2, 3, 4, 5, 6, 7,
  157.  8, 9, 10, 11, 12, 13, 14, 15,
  158.  16, 24, 25, 26, 27, 28, 29, 30,
  159.  24, 25, 26, 27, 28, 29, 30, 31,
  160.  32, 33, 34, 35, 36, 37, 38, 39,
  161.  40, 32, 33, 34, 35, 36, 37, 38,
  162.  48, 49, 50, 51, 52, 53, 54, 55,
  163.  56, 57, 58, 59, 60, 61, 62, 63};
  164. const INTSIZE __aligned epmove2[64] =
  165. {0, 1, 2, 3, 4, 5, 6, 7,
  166.  8, 9, 10, 11, 12, 13, 14, 15,
  167.  25, 26, 27, 28, 29, 30, 31, 23,
  168.  24, 25, 26, 27, 28, 29, 30, 31,
  169.  32, 33, 34, 35, 36, 37, 38, 39,
  170.  33, 34, 35, 36, 37, 38, 39, 47,
  171.  48, 49, 50, 51, 52, 53, 54, 55,
  172.  56, 57, 58, 59, 60, 61, 62, 63};
  173.  
  174.  
  175. /*
  176.  * nextpos[piece][from-square] , nextdir[piece][from-square] gives vector of
  177.  * positions reachable from from-square in ppos with piece such that the
  178.  * sequence    ppos = nextpos[piece][from-square]; pdir =
  179.  * nextdir[piece][from-square]; u = ppos[sq]; do { u = ppos[u]; if(color[u]
  180.  * != neutral) u = pdir[u]; } while (sq != u); will generate the sequence of
  181.  * all squares reachable from sq.
  182.  *
  183.  * If the path is blocked u = pdir[sq] will generate the continuation of the
  184.  * sequence in other directions.
  185.  */
  186.  
  187. unsigned char __far __aligned nextpos[8][64][64];
  188. unsigned char __far __aligned nextdir[8][64][64];
  189.  
  190. /*
  191.  * ptype is used to separate white and black pawns, like this; ptyp =
  192.  * ptype[side][piece] piece can be used directly in nextpos/nextdir when
  193.  * generating moves for pieces that are not black pawns.
  194.  */
  195. const INTSIZE __aligned ptype[2][8] =
  196. {
  197.   no_piece, pawn, knight, bishop, rook, queen, king, no_piece,
  198.   no_piece, bpawn, knight, bishop, rook, queen, king, no_piece};
  199.  
  200. /* data used to generate nextpos/nextdir */
  201. static const INTSIZE __aligned direc[8][8] =
  202. {
  203.   0, 0, 0, 0, 0, 0, 0, 0,
  204.   10, 9, 11, 0, 0, 0, 0, 0,
  205.   8, -8, 12, -12, 19, -19, 21, -21,
  206.   9, 11, -9, -11, 0, 0, 0, 0,
  207.   1, 10, -1, -10, 0, 0, 0, 0,
  208.   1, 10, -1, -10, 9, 11, -9, -11,
  209.   1, 10, -1, -10, 9, 11, -9, -11,
  210.   -10, -9, -11, 0, 0, 0, 0, 0};
  211. static const INTSIZE __aligned max_steps[8] =
  212. {0, 2, 1, 7, 7, 7, 1, 2};
  213. static const INTSIZE __aligned nunmap[120] =
  214. {
  215.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  216.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  217.   -1, 0, 1, 2, 3, 4, 5, 6, 7, -1,
  218.   -1, 8, 9, 10, 11, 12, 13, 14, 15, -1,
  219.   -1, 16, 17, 18, 19, 20, 21, 22, 23, -1,
  220.   -1, 24, 25, 26, 27, 28, 29, 30, 31, -1,
  221.   -1, 32, 33, 34, 35, 36, 37, 38, 39, -1,
  222.   -1, 40, 41, 42, 43, 44, 45, 46, 47, -1,
  223.   -1, 48, 49, 50, 51, 52, 53, 54, 55, -1,
  224.   -1, 56, 57, 58, 59, 60, 61, 62, 63, -1,
  225.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  226.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
  227.  
  228. int __aligned InitFlag = false;
  229. void
  230. Initialize_moves (void)
  231.  
  232. /*
  233.  * This procedure pre-calculates all moves for every piece from every square.
  234.  * This data is stored in nextpos/nextdir and used later in the move
  235.  * generation routines.
  236.  */
  237.  
  238. {
  239.   INTSIZE ptyp, po, p0, d, di, s, delta;
  240.   unsigned char *ppos, *pdir;
  241.   INTSIZE dest[8][8];
  242.   INTSIZE steps[8];
  243.   INTSIZE sorted[8];
  244.  
  245.   for (ptyp = 0; ptyp < 8; ptyp++)
  246.     for (po = 0; po < 64; po++)
  247.       for (p0 = 0; p0 < 64; p0++)
  248.     {
  249.       nextpos[ptyp][po][p0] = (unsigned char) po;
  250.       nextdir[ptyp][po][p0] = (unsigned char) po;
  251.     }
  252.   for (ptyp = 1; ptyp < 8; ptyp++)
  253.     for (po = 21; po < 99; po++)
  254.       if (nunmap[po] >= 0)
  255.     {
  256.       ppos = nextpos[ptyp][nunmap[po]];
  257.       pdir = nextdir[ptyp][nunmap[po]];
  258.       /* dest is a function of direction and steps */
  259.       for (d = 0; d < 8; d++)
  260.         {
  261.           dest[d][0] = nunmap[po];
  262.           delta = direc[ptyp][d];
  263.           if (delta != 0)
  264.         {
  265.           p0 = po;
  266.           for (s = 0; s < max_steps[ptyp]; s++)
  267.             {
  268.               p0 = p0 + delta;
  269.  
  270.               /*
  271.                * break if (off board) or (pawns only move two
  272.                * steps from home square)
  273.                */
  274.               if ((nunmap[p0] < 0) || (((ptyp == pawn) || (ptyp == bpawn))
  275.                            && ((s > 0) && ((d > 0) || (Stboard[nunmap[po]] != pawn)))))
  276.             break;
  277.               else
  278.             dest[d][s] = nunmap[p0];
  279.             }
  280.         }
  281.           else
  282.         s = 0;
  283.  
  284.           /*
  285.            * sort dest in number of steps order currently no sort
  286.            * is done due to compability with the move generation
  287.            * order in old gnu chess
  288.            */
  289.           steps[d] = s;
  290.           for (di = d; s > 0 && di > 0; di--)
  291.         if (steps[sorted[di - 1]] == 0)    /* should be: < s */
  292.           sorted[di] = sorted[di - 1];
  293.         else
  294.           break;
  295.           sorted[di] = d;
  296.         }
  297.  
  298.       /*
  299.        * update nextpos/nextdir, pawns have two threads (capture
  300.        * and no capture)
  301.        */
  302.       p0 = nunmap[po];
  303.       if (ptyp == pawn || ptyp == bpawn)
  304.         {
  305.           for (s = 0; s < steps[0]; s++)
  306.         {
  307.           ppos[p0] = (unsigned char) dest[0][s];
  308.           p0 = dest[0][s];
  309.         }
  310.           p0 = nunmap[po];
  311.           for (d = 1; d < 3; d++)
  312.         {
  313.           pdir[p0] = (unsigned char) dest[d][0];
  314.           p0 = dest[d][0];
  315.         }
  316.         }
  317.       else
  318.         {
  319.           pdir[p0] = (unsigned char) dest[sorted[0]][0];
  320.           for (d = 0; d < 8; d++)
  321.         for (s = 0; s < steps[sorted[d]]; s++)
  322.           {
  323.             ppos[p0] = (unsigned char) dest[sorted[d]][s];
  324.             p0 = dest[sorted[d]][s];
  325.             if (d < 7)
  326.               pdir[p0] = (unsigned char) dest[sorted[d + 1]][0];
  327.  
  328.             /*
  329.              * else is already initialized
  330.              */
  331.           }
  332.         }
  333.     }
  334. }
  335.  
  336. void
  337. NewGame (void)
  338.  
  339. /*
  340.  * Reset the board and other variables to start a new game.
  341.  */
  342.  
  343. {
  344.   INTSIZE l, p;
  345.   int tmp;
  346.   char tstr[32];
  347.   INTSIZE a, r, c, sq, i, found;
  348.   int tmpcolor;
  349.   char s[16];
  350.  
  351.  TTadd = ISZERO = 1;
  352.  if (AmigaStarted)
  353.   {
  354.    if (FirstTime)
  355.     {
  356.      FirstTime = 0;
  357.     }
  358.    else
  359.     {
  360.      if (!LoadFullBitMap())
  361.       {
  362.        ExitChess();
  363.       }
  364.      (void)SetTaskPri((struct Task *)myproc,procpri);
  365.     }
  366.   }
  367. /* SupervisorMode = 0;*/
  368.  previous_score = 0;
  369.  global_tmp_score = 0;
  370.  CheckIllegal = IllegalMove = 0;
  371.   Mate = 0;
  372.  ResignOffered = 0;
  373.  ThinkAheadDepth = ThinkAheadWorked = 0;
  374.  DrawnGame = 0;
  375.  MateString[0] = '\0';
  376.   compptr = oppptr = 0; // was -1 in 2.35
  377.   stage = stage2 = -1;        /* the game is not yet started */
  378.   flag.illegal = flag.mate = flag.quit = flag.reverse = flag.bothsides = flag.onemove = flag.force = false;
  379.   flag.material = flag.coords = flag.hash = flag.beep = flag.rcptr = true;
  380.   flag.threat = true;
  381.   flag.stars = flag.shade = flag.back = flag.musttimeout = false;
  382. #ifdef CLIENT
  383.   flag.gamein = true;
  384. #else 
  385.   flag.gamein = false;
  386. #endif
  387. #if defined(MSDOS) && !defined(SEVENBIT)
  388.   flag.rv = false;
  389. #else
  390.   flag.rv = true;
  391. #endif /* MSDOS && !SEVENBIT */
  392.  
  393.   mycnt1 = mycnt2 = 0;
  394.   GenCnt = NodeCnt = et0 = epsquare = XCmore = 0;
  395.   dither = 0;
  396.   WAwindow = WAWNDW;
  397.   WBwindow = WBWNDW;
  398.   BAwindow = BAWNDW;
  399.   BBwindow = BBWNDW;
  400.   xwndw = BXWNDW;
  401.   if (!MaxSearchDepth)
  402.     MaxSearchDepth = MAXDEPTH - 1;
  403.   contempt = 0;
  404.   GameCnt = 0;
  405.   Game50 = 1;
  406.   hint = 0x0C14;
  407.   ISZERO = 1;
  408.   ZeroRPT ();
  409.   Developed[white] = Developed[black] = false;
  410.   MouseDropped = 0;
  411.   Castled[white] = Castled[black] = 0;
  412.   myEnPassant[white] = myEnPassant[black] = 0;
  413.   castld[white] = castld[black] = false;
  414. #if defined NULLMOVE || defined DEEPNULL
  415.   no_null=0;
  416.   null = 0;         /* Null-move already made or not */
  417.   PVari = 0;        /* Is this the PV */
  418. #endif
  419.   PawnStorm = start_stage = 0;
  420.   thrashing_tt = 0; /* must we recycle slots at random. TomV */
  421.   ClearMem(QueenCheck,MAXDEPTH*sizeof(short));
  422.   ClearMem(PrVar,MAXDEPTH*sizeof(short));
  423.   ClearMem(Threat,MAXDEPTH*sizeof(short));
  424.   ClearMem(ThreatSave,MAXDEPTH*sizeof(short));
  425.   ClearMem(Pscore,MAXDEPTH*sizeof(short));
  426.   ClearMem(Tscore,MAXDEPTH*sizeof(short));
  427.   ClearMem(ChkFlag,MAXDEPTH*sizeof(short));
  428.   ClearMem(CptrFlag,MAXDEPTH*sizeof(short));
  429.   ClearMem(PawnThreat,MAXDEPTH*sizeof(short));
  430.   PawnThreat[0] = CptrFlag[0] = false;
  431.   Pscore[0] = 12000;
  432.   Tscore[0] = 12000;
  433.   opponent = white;
  434.   computer = black;
  435.   for (l = 0; l < TREE; l++)
  436.     Tree[l].f = Tree[l].t = 0;
  437.  gsrand ((unsigned int) 1);
  438.   if (!InitFlag)
  439.     {
  440.       for (c = white; c <= black; c++)
  441.     for (p = pawn; p <= king; p++)
  442.       for (l = 0; l < 64; l++)
  443.         {
  444.           hashcode[c][p][l].key = (((unsigned long) urand ()));
  445.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 16);
  446.           hashcode[c][p][l].bd = (((unsigned long) urand ()));
  447.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 16);
  448. #ifdef LONG64
  449.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 32);
  450.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 48);
  451.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 32);
  452.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 48);
  453. #endif
  454.         }
  455.     }
  456.   for (l = 0; l < 64; l++)
  457.     {
  458.       board[l] = Stboard[l];
  459.       color[l] = Stcolor[l];
  460.       Mvboard[l] = 0;
  461.     }
  462.   InitializeStats ();
  463.   time0 = time ((long *) 0);
  464.   ElapsedTime (1);
  465.   flag.regularstart = true;
  466.   if (MenuStripSet)
  467.    {
  468.     MenuItem8ab.Flags |= CHECKED;
  469.     SetMenuStrip(wG,&MenuList1);    /* attach any Menu */
  470.    }
  471.   Book = BOOKFAIL;
  472.   if (!InitFlag)
  473.     {
  474.       if (TCflag)
  475.        {
  476.         strcpy(tstr,"60 10");
  477.     SelectLevel (tstr);
  478.     SetTimeControl ();
  479.        }
  480.       else if (MaxResponseTime == 0)
  481.        {
  482.         strcpy(tstr,"60 10");
  483.     SelectLevel (tstr);
  484.     SetTimeControl ();
  485.        }
  486.       UpdateDisplay (0, 0, 1, 0);
  487. /*    GetOpenings(black);*/
  488. #ifdef CACHE
  489.       Initialize_ttable();
  490. #endif
  491.       InitFlag = true;
  492.     }
  493.    else
  494.     {
  495.       if (TCflag)
  496.        {
  497.         sprintf(tstr,"%d %d",TCmoves,TCminutes);
  498.     SelectLevel (tstr);
  499.     SetTimeControl ();
  500.        }
  501.     }
  502.   GetOpenings(black);
  503.   hashbd = hashkey = 0;
  504. #ifdef AMIGA
  505.   tmp = player;
  506.   player = white;
  507.   UpdateClocks();
  508.   player = black;
  509.   UpdateClocks();
  510.   player = tmp;
  511. #endif
  512. #ifdef CACHE
  513. #if ttblsz
  514.   ZeroTTable ();
  515.   TTadd = 0;
  516. #endif /* ttblsz */
  517. #ifndef AMIGA
  518.    memset ((signed char *) etab, 0, sizeof (etab));
  519. #else
  520.    ClearMem(etab,sizeof(etab));
  521. #endif
  522. #endif
  523.  if (PlayMode == 1)
  524.   {
  525.     flag.regularstart = false;
  526.     Book = 0;
  527.  
  528.       strcpy(s," g8");
  529.       a = tmpcolor = black;
  530.       c = s[1] - 'a';
  531.       r = s[2] - '1';
  532.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  533.     {
  534.       sq = locn (r, c);
  535.       color[sq] = a;
  536.       board[sq] = no_piece;
  537.       for (i = no_piece; i <= king; i++)
  538.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  539.           {
  540.         board[sq] = i;
  541.         found=1;
  542.         break;
  543.           }
  544.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  545.     }
  546.       strcpy(s," b8");
  547.       a = tmpcolor = black;
  548.       c = s[1] - 'a';
  549.       r = s[2] - '1';
  550.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  551.     {
  552.       sq = locn (r, c);
  553.       color[sq] = a;
  554.       board[sq] = no_piece;
  555.       for (i = no_piece; i <= king; i++)
  556.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  557.           {
  558.         board[sq] = i;
  559.         found=1;
  560.         break;
  561.           }
  562.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  563.     }
  564.  
  565.     if (MenuStripSet)
  566.      {
  567.       OnMenu(wG,ADVANCEDMENUNUM);
  568.       OffMenu(wG,BOOKMENUNUM);
  569.       OffMenu(wG,INTERMEDIATEMENUNUM); 
  570.       OnMenu(wG,EASYMENUNUM); 
  571.      }
  572.     GameCnt = 0;
  573.     Game50 = 1;
  574.     ISZERO = 1;
  575.     ZeroRPT ();
  576.     Sdepth = 0;
  577.     InitializeStats ();
  578.     DrawAmigaBoard();
  579.   }
  580.  else if (PlayMode == 0)
  581.   {
  582.     flag.regularstart = false;
  583.     Book = 0;
  584.  
  585.       strcpy(s," d8");
  586.       a = tmpcolor = black;
  587.       c = s[1] - 'a';
  588.       r = s[2] - '1';
  589.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  590.     {
  591.       sq = locn (r, c);
  592.       color[sq] = a;
  593.       board[sq] = no_piece;
  594.       for (i = no_piece; i <= king; i++)
  595.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  596.           {
  597.         board[sq] = i;
  598.         found=1;
  599.         break;
  600.           }
  601.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  602.     }
  603.       strcpy(s," g8");
  604.       a = tmpcolor = black;
  605.       c = s[1] - 'a';
  606.       r = s[2] - '1';
  607.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  608.     {
  609.       sq = locn (r, c);
  610.       color[sq] = a;
  611.       board[sq] = no_piece;
  612.       for (i = no_piece; i <= king; i++)
  613.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  614.           {
  615.         board[sq] = i;
  616.         found=1;
  617.         break;
  618.           }
  619.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  620.     }
  621.       strcpy(s," b8");
  622.       a = tmpcolor = black;
  623.       c = s[1] - 'a';
  624.       r = s[2] - '1';
  625.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  626.     {
  627.       sq = locn (r, c);
  628.       color[sq] = a;
  629.       board[sq] = no_piece;
  630.       for (i = no_piece; i <= king; i++)
  631.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  632.           {
  633.         board[sq] = i;
  634.         found=1;
  635.         break;
  636.           }
  637.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  638.     }
  639.  
  640.    if (MenuStripSet)
  641.     {
  642.      OnMenu(wG,ADVANCEDMENUNUM); 
  643.      OnMenu(wG,INTERMEDIATEMENUNUM); 
  644.      OffMenu(wG,EASYMENUNUM);
  645.      OffMenu(wG,BOOKMENUNUM);
  646.     }
  647.     GameCnt = 0;
  648.     Game50 = 1;
  649.     ISZERO = 1;
  650.     ZeroRPT ();
  651.     Sdepth = 0;
  652.     InitializeStats ();
  653.     DrawAmigaBoard();
  654.   }
  655.  else if (PlayMode == 2)
  656.   {
  657.     if (MenuStripSet)
  658.      {
  659.       OnMenu(wG,BOOKMENUNUM);
  660.       OffMenu(wG,ADVANCEDMENUNUM); 
  661.       OnMenu(wG,INTERMEDIATEMENUNUM); 
  662.       OnMenu(wG,EASYMENUNUM); 
  663.      }
  664.   }
  665. #ifdef KILLT
  666.  ClearMem(killt,sizeof(killt));
  667.  Initialize_dist ();
  668. #endif
  669. #ifdef HISTORY
  670. #ifdef AMIGA
  671.  ClearMem(history,sizeof(history));
  672. #else
  673.  memset(history,0,sizeof(history));
  674. #endif
  675. #endif
  676. #ifdef NODITHER
  677.   PCRASH = PCRASHS;
  678.   PCENTER = PCENTERS;
  679. #else
  680.   PCRASH = PCRASHS + (dither?(rand() % PCRASHV):0);
  681.   PCENTER = PCENTERS + (dither?(rand() % PCENTERV):0);
  682. #endif
  683. }
  684.  
  685. void
  686. InitConst (char *lang)
  687. {
  688.   FILE *constfile;
  689.   char s[256];
  690.   char sl[5];
  691.   int len, entry;
  692.   char *p, *q;
  693.  
  694.   constfile = fopen (LANGFILE, "r");
  695.   if (!constfile)
  696.     {
  697.      /* printf ("NO LANGFILE\n");*/
  698.       exit (1);
  699.     }
  700.   while (fgets (s, sizeof (s), constfile))
  701.     {
  702.       if (s[0] == '!')
  703.     continue;
  704.       len = strlen (s);
  705.       for (q = &s[len]; q > &s[8]; q--)
  706.     if (*q == '}')
  707.       break;
  708.       if (q == &s[8])
  709.     {
  710. /*      printf ("{ error in cinstfile\n");*/
  711.       exit (1);
  712.     }
  713.       *q = '\0';
  714.       if (s[3] != ':' || s[7] != ':' || s[8] != '{')
  715.     {
  716.     /*  printf ("Langfile format error %s\n", s);*/
  717.       exit (1);
  718.     }
  719.       s[3] = s[7] = '\0';
  720.       if (lang == NULL)
  721.     {
  722.       lang = sl;
  723.       strcpy (sl, &s[4]);
  724.     }
  725.       if (strcmp (&s[4], lang))
  726.     continue;
  727.       entry = atoi (s);
  728.       if (entry < 0 || entry >= CPSIZE)
  729.     {
  730.      /* printf ("Langfile number error\n");*/
  731.       exit (1);
  732.     }
  733.       for (q = p = &s[9]; *p; p++)
  734.     {
  735.       if (*p != '\\')
  736.         {
  737.           *q++ = *p;
  738.         }
  739.       else if (*(p + 1) == 'n')
  740.         {
  741.           *q++ = '\n';
  742.           p++;
  743.         }
  744.     }
  745.       *q = '\0';
  746.       if (entry < 0 || entry > 255)
  747.     {
  748.      /* printf ("Langfile error %d\n", entry);*/
  749.       exit (0);
  750.     }
  751.       CP[entry] = (char *) malloc ((unsigned) strlen (&s[9]) + 1);
  752.       if (CP[entry] == NULL)
  753.     {
  754.       ShowMessage("malloc");
  755.       exit (0);
  756.     }
  757.       strcpy (CP[entry], &s[9]);
  758.  
  759.     }
  760.   fclose (constfile);
  761. }
  762.  
  763. #ifndef CACHE
  764. #ifdef ttblsz
  765. void
  766. Initialize_ttable ()
  767. {
  768.   if (rehash < 0)
  769.     rehash = MAXrehash - 1;
  770. }
  771.  
  772. #endif /* ttblsz */
  773.  
  774. #else
  775.  
  776. #ifdef ttblsz
  777. void
  778.  
  779. Initialize_ttable ()
  780. {
  781.   char astr[32];
  782.   int doit = true;
  783.   if (rehash < 0)
  784.     rehash = MAXrehash;
  785. while(doit && ttblsize >= (1<<13)){
  786.   ttable[0] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  787.   ttable[1] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  788.   if(ttable[0] == NULL || ttable[1] == NULL){
  789.   if(ttable[0] != NULL)free(ttable[0]);
  790.   ttblsize = ttblsize>>1;
  791.   } else doit = false;
  792. }
  793.   if(ttable[0] == NULL || ttable[1] == NULL)
  794.    {
  795.     ShowMessage("Critical Mem Failure");
  796.     Delay(100L);
  797.     AmigaShutDown();
  798.     exit(1);
  799.    }
  800.   sprintf(astr,"transposition tbl is %d\n",ttblsize);
  801.   ShowMessage(astr);
  802. }
  803.  
  804. #endif /* ttblsz */
  805. #endif
  806.